/*
 * @lc app=leetcode id=6 lang=cpp
 *
 * [6] ZigZag Conversion
 *
 * https://leetcode.com/problems/zigzag-conversion/description/
 *
 * algorithms
 * Medium (34.59%)
 * Likes:    1387
 * Dislikes: 4063
 * Total Accepted:    408K
 * Total Submissions: 1.2M
 * Testcase Example:  '"PAYPALISHIRING"\n3'
 *
 * The string "PAYPALISHIRING" is written in a zigzag pattern on a given number
 * of rows like this: (you may want to display this pattern in a fixed font for
 * better legibility)
 * 
 * 
 * P   A   H   N
 * A P L S I I G
 * Y   I   R
 * 
 * 
 * And then read line by line: "PAHNAPLSIIGYIR"
 * 
 * Write the code that will take a string and make this conversion given a
 * number of rows:
 * 
 * 
 * string convert(string s, int numRows);
 * 
 * Example 1:
 * 
 * 
 * Input: s = "PAYPALISHIRING", numRows = 3
 * Output: "PAHNAPLSIIGYIR"
 * 
 * 
 * Example 2:
 * 
 * 
 * Input: s = "PAYPALISHIRING", numRows = 4
 * Output: "PINALSIGYAHRPI"
 * Explanation:
 * 
 * P     I    N
 * A   L S  I G
 * Y A   H R
 * P     I
 * 
 */

// @lc code=start
class Solution {
public:
    string convert(string s, int numRows) {
        if (s == "" || numRows == 1) return s;

        int size = min(int(s.size()), numRows);
        vector<string> v(size);
        int row = 0;
        bool down = true;
        for (int i = 0; i < s.size(); ++i) {
            v[row] += s[i];
            row = down ? ++row : --row;
            if (row == 0 || row == size - 1) down = !down;
        }

        string res = "";
        for (string str : v) {
            res += str;
        }
        return res;
    }
};
// @lc code=end

